package com.rongxunwu.netty.hello;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.channel.socket.SocketChannel;
import io.netty.util.Constant;

import java.io.UnsupportedEncodingException;
import java.nio.Buffer;
import java.nio.charset.Charset;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * TODO
 *
 * @author rongxun.wu01
 * @version 1.0
 * @date 2021/10/29 9:08
 */
public class HttpServerHandler extends ChannelInboundHandlerAdapter {
    /**
     * 当客户端主动链接服务端的链接后，这个通道就是活跃的了。也就是客户端与服务端建立了通信通道并且可以传输数据
     */
    @Override
    public void channelActive(ChannelHandlerContext ctx) throws Exception {
        SocketChannel channel = (SocketChannel) ctx.channel();
        System.out.println("链接报告开始");
        System.out.println("链接报告信息：有一客户端链接到本服务端");
        System.out.println("链接报告IP:" + channel.localAddress().getHostString());
        System.out.println("链接报告Port:" + channel.localAddress().getPort());
        System.out.println("链接报告完毕");
        //通知客户端链接建立成功
        String str = "通知客户端链接建立成功" + " " + new Date() + " " + channel.localAddress().getHostString() + "\r\n";
        ByteBuf buf = Unpooled.buffer(str.getBytes().length);
        buf.writeBytes(str.getBytes("UTF-8"));
        ctx.channel().read();
    }

    /**
     * 当客户端主动断开服务端的链接后，这个通道就是不活跃的。也就是说客户端与服务端的关闭了通信通道并且不可以传输数据
     */
    @Override
    public void channelInactive(ChannelHandlerContext ctx) throws Exception {
        System.out.println("客户端断开链接" + ctx.channel().localAddress().toString());

    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        //接收msg消息{与上一章节相比，此处已经不需要自己进行解码}
        System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + " 接收到消息：" + msg);
        //通知客户端链消息发送成功

        ByteBuf in = (ByteBuf) msg;

        byte[] buffer=new byte[in.readableBytes()];
        in.readBytes(buffer);

        String str=new String(buffer, Charset.forName("UTF-8"));
        //将消息记录到控制台
        System.out.println( "Server received: " +str );
        ctx.write(in);
        System.out.printf("Thread:      "+Thread.currentThread().getName());
        String str2 = "服务端收到：" + new Date() + " " + str + "\r\n";
        ByteBuf buf = Unpooled.buffer(str2.getBytes().length);
        buf.writeBytes(str2.getBytes(Charset.forName("UTF-8")));
        // 返回给客户端响应                                                                                                                                                       和客户端链接中断即短连接，当信息返回给客户端后中断
        final ChannelFuture f=ctx.writeAndFlush(str2);//.addListener(ChannelFutureListener.CLOSE);
        f.addListener(ChannelFutureListener.CLOSE);
        ctx.write(str2); // (1)
        ctx.flush(); // (2)
    }

    // 数据读取完毕的处理
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        System.err.println("服务端读取数据完毕");
    }

    // 出现异常的处理
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        System.err.println("server 读取数据出现异常");
        ctx.close();
    }

}
